「staticおじさん」という言葉をご存じでしょうか。「static」というのは、Javaのstaticメソッドのことです。Javaでメソッドを呼び出すときにはクラスからインスタンスを生成してインスタンスのメソッドを呼び出すのが普通です。一方、staticメソッドはインスタンスを生成しなくてもクラスから直接呼び出せます。このため、オブジェクト指向プログラミングを理解していない古いタイプのプログラマは、Javaでもstaticメソッドを多用します。これを揶揄して「staticおじさん」と呼ぶのです。 staticおじさんについては、わかりやすく解説したブログエントリが有名です(参考リンク)。実際のシステム開発の現場でstaticおじさんに苦しめられている様子をまとめたページもあります(参考リンク)。 なお、Javaのstaticメソッドを多用する人に限らず、古い感覚にとらわれて周囲に迷惑をま
「global変数とstatic変数の違いがよくわからない」という人の大半は、 教科書を読んで、global変数も、static変数も、「値が保持されるんだな」というイメージを持ってしまっている点にあると思われる。 たとえば、global変数は、local変数と異なり、スコープ外へ出ても値が保持される。 本来は、global変数は「どこから全てのスコープからアクセスできる変数」のことなのだが、local変数がスコープの外へ出ると値が無くなるという風に説明されるため、 対比として「スコープの外へ出ても値が保持されるんだな」と本来の概念とは異なった意味で理解してしまう。 次に、staticローカル変数だが、 そもそも、static変数の元々の意味は、呼び出しの度に初期化されない変数のこと。すなわちglobalではなくて、自動変数(auto変数)と対比される。 static変数もまた、スコープを
abstractなstaticメソッド クラスAを継承してクラスA1、クラスA2を作ろうとしています。 Aは抽象クラスまたはインターフェースを想定しています。 この際、サブクラス固有の情報を返すstaticメソッドをAで定義し、各サブクラスで必ずオーバーライドさせたいと考えています。 (例えば、A1.func()では"a1"、A2.func()では"a2"を返すようにしたい) しかしstaticメソッドはabstractまたはinterfaceで定義できないので困っています。 staticメソッドはAで定義し、固有の情報を持つフィールドをサブクラスで定義させれば良いかと思いましたが、フィールドも抽象化できないんですよね。 このような場合どうすればよいでしょうか? よろしくお願いします。 皆さんご回答ありがとうございます。 例が分かりにくくて申し訳ありませんが、staticメソッドによってク
前回の続きです。 ○モジュール設計 優れたプログラムは、極めて慎重にモジュール設計がなされています。機能ごとに分けられたコンポーネントや適切に階層化されたレイヤーは、なるべく互いに関係性を持たないように区切られています。 例えば、上位に位置する層はOSやRDBMSに直接アクセスすることはありませんし、逆に下位層がユーザーインターフェイスの変更に影響を受けることはありません。重要なのは、そのモジュールをいかに外部を意識しないように作るか、ということです。 参照する側の事情に左右されない独立性・汎用性が、設計のカギとなることでしょう。オブジェクト指向言語においては、これら論理構造上の区分けは、クラスの階層やJavaのpackageなどでより明示化された実装が可能となります。 ○疎結合性を阻害するスコープの問題 プログラム品質を決定づける大きな要因の一つがスコープです。スコープが広がれば広がるほ
インスタンスの存在と無関係にクラス共通のフィールドを持たせて、 Ex1.str = "hoge"; Ex2.str = "moga"; のような書き方がしたい訳ではなく、 Ex1 ex1 = new Ex1(); ex1.str = "hoge"; のように常にインスタンスを介する使い方で、 同じクラスに属するどのインスタンスにも共通させたいが、 それぞれのクラスで宣言するのは面倒なので、 できればスーパークラスで処理を一元的に記述したいということなら、 直接フィールドにアクセスするやり方ではないが、 以下のようにスーパークラスにインスタンスメソッドのアクセッサを定義して、 Classクラスをキーにしてクラス変数のMapに格納しておく方法もある。 public abstract class AbstractStatic { private static java.util.HashMap<
概要 全く変化しない値を、異なる場所で何度も使いたい事があります。 このような場合、「リテラル」を何箇所にも分散させて書くのではなく、const というキーワードを用いて定義した定数を使うべきです。 ポイント const キーワードを使って、定数(値が絶対に変わらない / 変えれない変数)を定義できます。 見た目は変数と同じように使えますが、値の変更はできません。 コンパイル結果は「リテラル」を直接書いた場合と同様になります。 定数は、宣言時に値をリテラルで初期化できるものにしか使えません。(new できない。) より柔軟な初期化ができる readonly (読み取り専用)変数というものもあります。 変化しない値 例えば、以下のようなコードを見てください。 int[] array = new int[5]; for(int i=0; i<5; ++i) array[i] = int.Par
static関数 Copyright(C) 14May2003 coskx 複数のファイルからなる大規模プログラミングでは,一連の関数群を1つのファイルに作りこみ,いくつかのプログラムでその関数群を再利用することが多い。一連の関数群のうち,他のファイルから呼び出されない関数は,そのままでは関数名が重複してしまうことがあり,好ましくない。他のファイルから呼び出されない関数は関数名をそのファイル内でのみ有効にして,ほかのファイルからは見えないようにすることができる。 マルチソースファイル中で,関数にstatic修飾をつけると,その関数は,他のソースファイルからみえなくなる。この機能を用いると関数名の衝突事故を防ぐことが出来る。 あるソースファイル「〜.c」で定義している関数のうち,公開する関数はヘッダファイル「〜.h」にプロトタイプ宣言を記述し,公開しない関数はstatic修飾をつける。sta
再入不可能な関数を C で実装する 一度実行したら二度と中身を実行できなくなる再入不可能な関数を C で実装してみます。通常、このような関数はシングルトンなどの静的なデータの初期化に使いますが、ここではデータについては考えないことにします。 static 変数をフラグに使う まずは最も単純な方法から見ていきます。次の関数は static 変数をフラグに使って再入を防いでいます。厳密に言えば関数そのものには入ってしまっていますが、ここで気にしないことにします。 void once(void) { static int entered; // 最初は 0 if (entered == 1) { // すでに入ったことがある場合は return; // すぐ出る } entered = 1; // 初回の場合のみ、何かを実行する } この方法はシングルスレッドのプログラムではうまく動きますが、マ
C言語では、自動変数は明示的に初期化をしないと、その自動変数の値は未定義です。なので自動変数には明示的に初期化をする必要があります。 一方、静的変数(static変数)は明示的に初期化をしないと、0(数値型)またはNULL(ポインタ型)に初期化されます。 int i; /* 何が入っているか分からない */ static int j; /* 0が入っている */ ただし、単一の変数の宣言だったら、たとえ0で初期化されているとはいえ、 static int j; よりも static int j = 0; と明示的に書いた方が可読性が高くて良いでしょう。 しかし、配列を扱うときなどは、このように明示的に表すのが難しく、初期値を省略するのが一般的です。 例えば以下のように char *p[15]; /* 各要素はNULLで初期化されている */ なぜなら、明示的に表そうとすると、 char *
日頃より楽天のサービスをご利用いただきましてありがとうございます。 サービスをご利用いただいておりますところ大変申し訳ございませんが、現在、緊急メンテナンスを行わせていただいております。 お客様には、緊急のメンテナンスにより、ご迷惑をおかけしており、誠に申し訳ございません。 メンテナンスが終了次第、サービスを復旧いたしますので、 今しばらくお待ちいただけますよう、お願い申し上げます。
C言語のstatic指定子について説明しています。staticを使用する場所は関数の中と外の2種類あります。それぞれについて説明します。 staticとは、C言語での記憶クラス指定子のひとつで宣言したオブジェクトに静的な記憶クラスを与えるものです。staticはスタティックと読みます。記憶クラス指定子には、他にauto, register, extern, typedefがあります。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く