• ベストアンサー

javaのprivate finalメンバについて、

javaのprivate finalメンバについて、 public void setMember(SomeClass obj){ getMember.setA(obj.getA()); getMember.setB(obj.getB()); } のような値をコピーするだけのsetterを作るのはおかしいですか? finalなのは同一性を保証したいからつけていて、中の値は変えたいのですが、 参照する側にとってsetterは通常参照の置き換えを意味して分かりにくくなるのではと気になりました。 値をコピーする場合のsetterの名前の付け方などあるのでしょうか。

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

getMember.setA(obj.getA()); // × member.setA(obj.getA());   // ○ class SomeThing { private String name; private int id; public String getName() { return name; } public int getId() { return id; } public void setName(String name) { this.name = name; } public void setId(int id) { this.id = id; } } class SomeThingUser { private final SomeThing member = new SomeThing(); public SomeThing getMember() { return member; } public void setMember(SomeThing obj){ member.setName( obj.getName() ); member.setId( obj.getId() ); } } public class SomeThingUserChecker { public static void main(String[] args) { SomeThingUser someThingUser = new SomeThingUser(); System.out.println(someThingUser.getMember().getName()); System.out.println(someThingUser.getMember().getId()); SomeThing someThing = new SomeThing(); someThing.setName("someThing"); someThing.setId(1); someThingUser.setMember(someThing); System.out.println(someThingUser.getMember().getName()); System.out.println(someThingUser.getMember().getId()); } }

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

ご質問の内容が分かりにくいです。 ・private final指定されているのは何でしょうか? SomeClassのメンバー? 他のクラスのメンバーになっているSomeClass? ・getMemberというのは何でしょうか? get~という名前やsetMember()との対比からgetterかな?と思ってしまいますが、どうもメソッドではないようです。 ・setMember()メソッドはSomeClassのメソッドでしょうか、それとも他のクラス?

LangFan
質問者

補足

private final SomeClass member; SomeClass getMember(); void setMember(SomeClass obj);

関連するQ&A

  • privateスコープについて

    はじめまして。Javaの初心者です。 どうしてもわからないことがあります。 以下のコードを見てみてください。 ************************************************ final class Foo { private int a; Foo(int a) { this.a = a; } public int func(Foo f) { if(this.a <= f.a) { return 1; } else { return -1; } } } final class Demo01 { public static void main(String[] args) { Foo obj1 = new Foo(10); Foo obj2 = new Foo(20); System.out.println(obj1.func(obj2)); } } ************************************************ Fooクラスの2つの異なるインスタンスのフィールドの 値の比較は、funcメソッドの呼び出しによって行われるのですが、funcメソッドの中で、実行中のインスタ ンス(this)のaにアクセス(this.a)することができるこ とは理解できるのですが、実行中のインスタンスとは 異なるFooクラスのインスタンスのaにアクセス(f.a)し たときprivateアクセスのため、参照できないとはなら ないのは、なぜなのでしょうか?どうかご教授をお願 いします。

    • ベストアンサー
    • Java
  • クラス内で上位クラス内メンバの値を変更

    クラス内で上位クラス内メンバの値を変更 test2Objクラス内で test1Objメンバ内のtest1Valueの値を2に変えたい このような事は可能でしょうか? ================================ class Test2Obj{ public: void changeValue(){ //ここでtest1Objメンバ内のtest1Valueの値を2に変えたい } }; class Test1Obj{ public: int test1Value; Test2Obj *test2Obj; //コンストラクタ Test1Obj(int tmp_test1Value){ setTest1Value(tmp_test1Value); test2Obj=new Test2Obj(); } void setTest1Value(int tmp_test1Value){test1Value=tmp_test1Value;} }; int main(void){ Test1Obj *test1Obj=new Test1Obj(1); printf(">>>%d\n",test1Obj->test1Value); //ここでtest1Obj->test1Valueの値を変えたい test1Obj->test2Obj->changeValue(); } ================================ もしコードに問題があればご指摘をお願いします。

  • Javaの細かい仕様を教えていただけませんか?

    ずっと前にちょろっと触ってJavaは一端離れていましたが 仕様を細かく確認してみたくなったので、駆け足で先ほどまた触れてみました。 なお、それぞれ触れた時間はだいぶ違いますが、プログラミング言語に関してはC、C++、C++/CLI、C#、HLSL、PHPは経験があります。(アセンブリはほんの少しだけ読める程度) なのでそれら(とくにC++)との比較を教えていただけると早く理解が出来そうで また、かなり多くの質問があります(だいたいは基本的なことでしょう)が、全部でなくとも、一部でもいいので教えていただけると助かります。 ためしに以下のようなコードを書いてみました。 class MySamplePrint { private static interface PrintIF { void Print(); //(1) } private static final class MyClass1<T> implements PrintIF { private final class Nest1{ private int num = 0;} private final Nest1 n = new Nest1(); //(2)、(3) private final T data; MyClass1( T data_, int num_ ){ //(4) data = data_; n.num = num_; } MyClass1( final T data_ ){ data = data_; } //(5) //MyClass1(){ this((T)0); } //(6)、(7) //(8) public void Print(){ System.out.println(data); System.out.println(n.num); } } public static void main(String[] arg){ PrintIF a = new MyClass1<Integer>(123); //(9) a.Print(); final MyClass1 b = new MyClass1("abc"); //(10) a = b; a.Print(); a = new MyClass1<String>("def",234); a.Print(); int i = 0; { //int i; //(11) int x = 0; } int x = 1; //(12) final PrintIF c = new MyClass1<String>("def",234); c.Print(); } } 結果 123 0 abc 0 def 234 def 234 (1) C++ でいうconstメンバ関数はJavaにもないですか?(可能であればvoid Print() const;のようなものを書きたい) (2)コンストラクタと、このようにメンバの宣言場所でついでに 「型 変数 = 何々;」については、どっちが先かとか明確な順番は規格上定義されているのでしょうか? (3)メンバ変数にも、このようにfinalを付け、コンストラクタ(か 「型 変数 = 何々;」)で一度だけ値を代入する、といったことが、試したら出来ましたが、これは仕様上普通に可能って事になっていますか? (4)C++でいう、int num_ = 0など、書かなかった場合それになる、というデフォルト引数というものは、Javaにもないんでしょうか?(つまり、呼び出し側で同じような書き方をしたければこのようにオーバーロードを使う?) (5)ローカル変数同様、引数にも普通にfinalを指定可能…? (6)C#ではC++の初期化子リストっぽく MyClass1() : this(何々){ } とか言う書き方になるかと思いますが、Javaでは専ら{}内にのみ記述(this(何々)だったら一行目)でしょうか? (7)この行はコメントアウトすると 「int から T へキャストすることはできません」 とエラーになります。 んでも(T)""にすると一応通ります。 String型などと整数の0(nullを意図してほしい)は互換性がないのでしょうか (8)C++やC#のoverrideのようにオーバーライドを明示的に示す方法(や、C#のnewに匹敵するものとか)はありませんか? (9)<int>はできませんでした。ジェネリックスに指定できる型にはどういう制限があるのでしょうか? (10)警告は出ましたが、<String>を省略しても通ってしまいました。これは興味本位で、実際は警告も出るので指定はすると思いますが、これは仕様ですか? (11)この場合、xは可ですがiはダメでした。つまり、CやC++と違い、スコープがより狭い範囲に変わっても「それまでに、より広いスコープで宣言されていた名前」とかぶる変数名の変数は宣言できない、ということでしょうか? (12)C++的には、このcは参照(というよりポインタに近い)と考えて、この場合finalはc自体の変更を阻止していますが、参照先の内容は変更可能に思います。 CやC++的には const PrintIF* c = ~ ではなく PrintIF* const c = ~ と同じ意味 出来れば const PrintIF* c = ~ や const PrintIF* const c = ~ といったことも可能だといいのですが、Javaでは仕様上、それは無理、でしょうか? その他、コード以外で (13)アクセス修飾子の指定を書かないと、Javaでは同一パッケージ内で参照可能、ということですが、この「パッケージ内」というのは、これはC#でいうinternalのような意味あいになる、ということでしょうか? (14)Javaでは非staticなメソッドは全て、C++でいうvirtualに自動的になる、ということでしょうか?(逆に言うと明示的な、virtualに相当する修飾子がない?) (15)Eclipseで タブが> 改行が曲がった矢印 で、全部の行に表示されるのですが テキストの色や背景色(白)の変更や、これらを非表示にする といったことは可能ですか?

    • ベストアンサー
    • Java
  • final修飾子

    Javaでfinal修飾子があると学びました. ・メソッドはオーバーライドできない ・変数は値の変更ができない ・クラスは継承できない この3点を実現することが可能ですよね? #間違っている・他にもあるなら教えてください. 私はfinalを引数につけてみました. public class Test {   public static void main(String[] args) {      char[] s = {'s','a','t','o'};      System.out.println(s);      modify(s);      // finalのはずが変更されている      System.out.println(s);      Integer i = 3;      Integer j = 6;      swap(i, j);      System.out.println(i + ":" + j);      Foo f1, f2;      f1 = new Foo();      f2 = new Foo();      f1.i = 3;      f2.i = 6;      swap(f1, f2);      System.out.println(f1.i + ":" + f2.i);    }    static void modify(final char[] s) {      s[0] = 'k';    }    static void swap(Integer i, Integer j) {      Integer temp;      temp = i;      i = j;      j = temp;    }    static void swap(Foo f1, Foo f2) {      int temp;      temp = f1.i;      f1.i = f2.i;      f2.i = temp;    } } class Foo {    int i; } modify関数でfinal修飾子をつけるとsatoがkatoにならないと予想していました. ですが,実際にはコンパイルエラーにもならずsato→katoになりました. final修飾子はC言語でいうところのchar * const c;でしょうか? #ポインタの値は変更できないが,参照先の値は変更できるということですか? あと,swap関数についても質問があります. そもそもポインタがないので,基本型を実引数に与えるときはコピーされ, 参照型はコピーされないですよね? なので,swap関数を2つ用意してみました. Fooクラスのswap関数,Integerクラスのswap関数の2つです. Fooクラスがうまく交換でき,Integerクラスが交換できない理由がわかりません. #Integer temp;を使って参照値を交換していると思うのですが,違うのでしょうか?

    • ベストアンサー
    • Java
  • Java リフレクションについて

    1.リフレクションを使い、値をセット(BeanのSetterメソッドにて) 2.1でセットした値を取得するために、下記コードで取得 Method Method = Class.getMethod("getLstData"); Object obj = Method.invoke(****); 上記の****の箇所には、メソッドのあるクラスのインスタンスを渡す、 というところまでは分かりますが、newInstance()してしまうと、新しいオブジェクトになってしまうので 値が取得できません。 error>>java.lang.IllegalArgumentException: object is not an instance of declaring class どのようにすれば、値の取得が可能でしょうか。 どなたかご教授いただければと思います。 ※Java 1.5を使用

    • ベストアンサー
    • Java
  • private voidなメソッドはstatic コンテキストですか

    コンパイルエラーで、 「static コンテキストから参照することはできません」 と表示されます。 ソースにstaticという文字は有りません。 private voidなメソッドはstatic コンテキストですか? [Foo.java] import com.nttdocomo.ui.*; public class Foo extends IApplication {  public void start() {   Display.setCurrent(new MyPanel());  } } class MyPanel extends Panel {  private void e() {   Bar.DShow(Dialog.DIALOG_ERROR, "", "");  } } [Bar.java] import com.nttdocomo.ui.*; public class Bar {  public void DShow(int type, String title, String body) {   Dialog d = new Dialog(type, title);   d.setText(body);   d.show();  } }

    • ベストアンサー
    • Java
  • java のstruts1.3です。

    java のstruts1.3です。 Cannot invoke newStrutsKadai.EntryWorkForm.setArrayDB on bean class 'class newStrutsKadai.EntryWorkForm' - argument type mismatch - had objects of type "java.lang.String" but expected signature "java.util.ArrayList" と言うエラーがでます。 以下javaのソースです。DB接続は完璧に出来ています。 public final class EntryWorkForm extends ActionForm { private static final long serialVersionUID = 1L; private String cmbOsName; ArrayList<EntryWorkForm> array = new ArrayList<EntryWorkForm>( ) ; public void reset( ActionMapping map, HttpServletRequest req ) { //必要な部分だけ抜粋 //検索された行数文ループ while( rs.next( ) ) {//本マスタテーブル 検索された行数文ループ String stOSName = rs.getString("OSName"); //上記の2行を丁寧に記述した EntryWorkForm obj = new EntryWorkForm( stOSName.toString() ); array.add( obj ) ; } //END while( rs.next( ) ) this.setArrayDB( array );//ここでエラーエラーエラー } /****************************************************************************************/ private ArrayList<EntryWorkForm> arrayDB = new ArrayList<EntryWorkForm>( ); //セット オブジェクト配列 public void setArrayDB( ArrayList<EntryWorkForm> arrayDB ){ this.arrayDB = arrayDB; } //ゲット オブジェクト配列 public ArrayList<EntryWorkForm> getArrayDB ( ) { return this.arrayDB ; } /****************************************************************************************/ public String getCmbOSName ( ) { return this.cmbOsName; } public void setCmbOSName ( String cmbOsName ) { this.cmbOsName = cmbOsName; } public EntryWorkForm( ) { } //コンストラクタ 引数あり EntryWorkForm ( String cmbOSName ) { System.out.println("テスト用で作成したコンストラクタが呼ばれています。 ReturnScreenFormDB.java"); cmbOsName = cmbOSName; } 質問です--- JSPでセレクトボックスに動的に出力しています。 JSP画面でボタンを押して画面遷移をすると上記のエラーが出ます。

    • ベストアンサー
    • Java
  • javaの同期について

    javaの同期について package rwlock; public class App1 extends Thread { static private final int REFER = 0; static private final int UPDATE = 1; static private final int[] conf1 = { REFER, REFER, REFER, UPDATE }; static private final int[] conf2 = { REFER, UPDATE, REFER, REFER }; static private MyObj0 mo = new MyObj0(); // App1 + MyObj0 int id; private int[] conf; public App1(int id, int[] conf) { this.id = id; this.conf = conf; } public void run() { long tStart = Time.current(); for (int i = 0; i < conf.length; i++) { switch(conf[i]) { case REFER: mo.refer(); break; case UPDATE: mo.update(); break; default: assert false : "internal error"; } } if (id == 1) { Time.printElapsed(tStart); } } public static void main(String[] args) { App1 th1 = new App1(1, conf1); App1 th2 = new App1(2, conf2); th1.start(); th2.start(); } } public class MyObj0 { private Object countLock = new Object(); private int count; private void enter() { synchronized(countLock) { count++; } } private void leave() { synchronized(countLock) { count--; } } public MyObj0() { count = 0; } public void refer() { enter(); Time.sleep(300); leave(); } public void update() { enter(); synchronized(countLock) { assert count == 1; } Time.sleep(500); leave(); } において、updateの実行中は、他のスレッドでもupdateもreferも実行されないが、二つのスレッドで同時にreferは実行されうるという条件を満たすにはどうしたらよいでしょうか?updateにsynchronizedをつけてみましたが、referが同時に実行されてしまいました。

    • ベストアンサー
    • Java
  • javaの同期について

    javaの同期について package rwlock; public class App1 extends Thread { static private final int REFER = 0; static private final int UPDATE = 1; static private final int[] conf1 = { REFER, REFER, REFER, UPDATE }; static private final int[] conf2 = { REFER, UPDATE, REFER, REFER }; static private MyObj0 mo = new MyObj0(); // App1 + MyObj0 int id; private int[] conf; public App1(int id, int[] conf) { this.id = id; this.conf = conf; } public void run() { long tStart = Time.current(); for (int i = 0; i < conf.length; i++) { switch(conf[i]) { case REFER: mo.refer(); break; case UPDATE: mo.update(); break; default: assert false : "internal error"; } } if (id == 1) { Time.printElapsed(tStart); } } public static void main(String[] args) { App1 th1 = new App1(1, conf1); App1 th2 = new App1(2, conf2); th1.start(); th2.start(); } } public class MyObj0 { private Object countLock = new Object(); private int count; private void enter() { synchronized(countLock) { count++; } } private void leave() { synchronized(countLock) { count--; } } public MyObj0() { count = 0; } public void refer() { enter(); Time.sleep(300); leave(); } public void update() { enter(); synchronized(countLock) { assert count == 1; } Time.sleep(500); leave(); } において、updateの実行中は、他のスレッドでもupdateもreferも実行されないが、二つのスレッドで同時にreferは実行されうるという条件を満たすにはどうしたらよいでしょうか?updateにsynchronizedをつけてみましたが、referが同時に実行されてしまいました

    • ベストアンサー
    • Java
  • javaのことで

    ---MainPanel.java--- import java.awt.Dimension; import java.awt.Graphics; import java.event.MouseEvent; import java.event.MouseListener; import javax.swing.JPanel; import java.util.Random; public class MainPanel extends JPanel implements MouseListener { public static final int WIDTH = 640; public static final int HEIGHT = 480; private static final int NUM_FILE = 4; private File[] file; private int prev; public MainPanel() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); file = new File[NUM_FILE]; for (int i = 0; i < NUM_FILE; i++) { file[i] = new File(i, this); } select(); addMouseListener(this); } private void clear() { for (int i = 0; i < NUM_FILE; i++) { file[i].delete(); } } private boolean check(int a, int b) { return a == b || a == prev || b == prev; } private void select() { Random rand = new Random(); int a, b; do { a = rand.nextInt(NUM_FILE); b = rand.nextInt(NUM_FILE); } while (check(a, b)); file[a].set(0, 0); file[b].set(file[a].getX() + file[a].getWith() + File.SPACE, 0); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { file[i].draw(g); } g.drawString("ファイル" + (i + 1) + " … " + file[i].getCnt(), 0, HEIGHT * 3 / 4 + i * 15); } } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { // 表示されていて // 画像内なら if (x > file[i].getX() && x < file[i].getX() + file[i].getWidth() && y < file[i].getY() && y > file[i].getY() + file[i].getHeight()) { file[i].count(); prev = i; clear(); select(); break; } } } repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } フレームを用意してMainPanelを付加し,pack();してください.

専門家に質問してみよう